package com.ysq.tankgame.gameImg;

import com.ysq.tankgame.MyTank;
import com.ysq.tankgame.Shot;
import com.ysq.tankgame.Tank;
import com.ysq.tankgame.tankValue.Node;
import com.ysq.tankgame.tankValue.Recorder;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;
import com.ysq.tankgame.EnteryTank;

import javax.swing.JPanel;

public class Mypanel extends JPanel implements KeyListener, Runnable {

    MyTank mytank = null; // 我的坦克
    Vector<EnteryTank> enemyTanks = new Vector<>(); // 敌方坦克
    int enemyTankNum = 4; // 敌方坦克数量
    Vector<Node> nodes = new Vector<>(); // 恢复的数据

    public Mypanel(String key) {
        switch (key) {
            case "1":
                mytank = new MyTank(500, 300); // 创建我的坦克
                Recorder.seteTanks(enemyTanks);
                for (int i = 0; i < enemyTankNum; i++) { // 创建敌方坦克
                    EnteryTank enteryTank = new EnteryTank(100 * (i + 1), 0);
                    enteryTank.setEnemyTanks(enemyTanks);
                    enteryTank.setDirect(2);
                    enemyTanks.add(enteryTank);
                    new Thread(enteryTank).start();
                }
                break;
            case "2":
                nodes = Recorder.load();
                System.out.println(nodes.size());
                mytank = new MyTank(500, 300); // 创建我的坦克
                Recorder.seteTanks(enemyTanks);
                for (int i = 0; i < nodes.size(); i++) { // 创建敌方坦克
                    EnteryTank enteryTank = new EnteryTank(nodes.get(i).getX(), nodes.get(i).getY());
                    enteryTank.setEnemyTanks(enemyTanks);
                    enteryTank.setDirect(nodes.get(i).getDirect());
                    enemyTanks.add(enteryTank);
                    new Thread(enteryTank).start();
                }
                break;
            default:
                System.out.println("输入错误");
                break;
        }

    }

    @Override
    public void paint(Graphics g) {
        super.paint(g); // 调用父类的方法
        g.fillRect(0, 0, 1000, 750); // 填充矩形
        drawValue(g);

        if (mytank.isLive()) {
            drawTank(mytank.getX(), mytank.getY(), g, mytank.getDirect(), 0); // 绘制坦克的封装方法
        }

        if (mytank.getShots().size() > 0) { // 如果我的坦克有子弹
            for (int i = 0; i < mytank.getShots().size(); i++) {
                Shot shot = mytank.getShots().get(i);
                drawShot(shot.getX(), shot.getY(), g, shot.getDirect(), 0);
                if (!shot.isLive()) {
                    mytank.getShots().remove(shot);
                }
            }
        }

        for (int i = 0; i < enemyTanks.size(); i++) {
            EnteryTank enteryTank = enemyTanks.get(i); // 获取敌方坦克
            if (enteryTank.isLive()) { // 如果敌方坦克存活
                drawTank(enteryTank.getX(), enteryTank.getY(), g, enteryTank.getDirect(), 1);
                if (enteryTank.getShots().size() > 0 && enteryTank.isLive()) { // 如果敌方坦克有子弹
                    for (int j = 0; j < enteryTank.getShots().size(); j++) {
                        Shot shot = enteryTank.getShots().get(j);
                        drawShot(shot.getX(), shot.getY(), g, shot.getDirect(), 1);
                        if (!shot.isLive()) {
                            enteryTank.getShots().remove(shot);
                        }
                    }
                }
            }
        }
    }

    /**
     * 绘制敌方被击毁的坦克数量
     * 
     * @param g
     */
    public void drawValue(Graphics g) {
        g.setColor(Color.black);
        g.setFont(new Font("宋体", Font.BOLD, 25));
        g.drawString("敌方被击毁的坦克数量", 1010, 40);
        drawTank(1010, 60, g, 0, 1);
        g.setColor(Color.black);
        g.drawString("x " + Recorder.getAllenemyTankNum(), 1070, 100);
    }

    /**
     * 绘制坦克的封装方法
     * 
     * @param x      坦克的横坐标
     * @param y      坦克的纵坐标
     * @param g      绘图工具
     * @param direct 坦克的方向
     * @param type   坦克的类型
     */
    public void drawTank(int x, int y, Graphics g, int direct, int type) {
        switch (type) {
            case 0: // 我方坦克
                g.setColor(Color.cyan);
                break;
            case 1: // 敌方坦克
                g.setColor(Color.yellow);
                break;
        }

        switch (direct) {
            case 0: // 向上
                g.fill3DRect(x, y, 10, 60, false); // 画坦克的左边
                g.fill3DRect(x + 30, y, 10, 60, false); // 画坦克的右边
                g.fill3DRect(x + 10, y + 10, 20, 40, false); // 画坦克的中间
                g.fillOval(x + 10, y + 20, 20, 20); // 画坦克的圆形
                g.drawLine(x + 20, y + 30, x + 20, y); // 画坦克的炮筒
                break;
            case 1: // 向右
                g.fill3DRect(x, y, 60, 10, false); // 画坦克的左边
                g.fill3DRect(x, y + 30, 60, 10, false); // 画坦克的右边
                g.fill3DRect(x + 10, y + 10, 40, 20, false); // 画坦克的中间
                g.fillOval(x + 20, y + 10, 20, 20); // 画坦克的圆形
                g.drawLine(x + 20, y + 20, x + 60, y + 20); // 画坦克的炮筒
                break;
            case 2: // 向下
                g.fill3DRect(x, y, 10, 60, false); // 画坦克的左边
                g.fill3DRect(x + 30, y, 10, 60, false); // 画坦克的右边
                g.fill3DRect(x + 10, y + 10, 20, 40, false); // 画坦克的中间
                g.fillOval(x + 10, y + 20, 20, 20); // 画坦克的圆形
                g.drawLine(x + 20, y + 30, x + 20, y + 60); // 画坦克的炮筒
                break;
            case 3: // 向左
                g.fill3DRect(x, y, 60, 10, false); // 画坦克的左边
                g.fill3DRect(x, y + 30, 60, 10, false); // 画坦克的右边
                g.fill3DRect(x + 10, y + 10, 40, 20, false); // 画坦克的中间
                g.fillOval(x + 20, y + 10, 20, 20); // 画坦克的圆形
                g.drawLine(x + 20, y + 20, x, y + 20); // 画坦克的炮筒
                break;
            default:
                System.out.println("暂时没有处理");
        }
    }

    /*
     * 绘制子弹
     */
    public void drawShot(int x, int y, Graphics g, int direct, int type) {
        switch (type) {
            case 0: // 我方子弹
                g.setColor(Color.cyan);
                break;
            case 1: // 敌方子弹
                g.setColor(Color.yellow);
                break;
        }

        switch (direct) {
            case 0: // 向上
            case 1: // 向右
            case 2: // 向下
            case 3: // 向左
                g.fillOval(x, y, 10, 10);
                break;
        }
    }

    /* 判断子弹是否击中 */
    public void isHit(Shot shot, Tank tank) {

        switch (tank.getDirect()) {
            case 0:
            case 2:
                if (shot.getX() > tank.getX() && shot.getX() < tank.getX() + 40
                        && shot.getY() > tank.getY()
                        && shot.getY() < tank.getY() + 60) {
                    shot.setLive(false);
                    if (tank instanceof EnteryTank) {
                        ((EnteryTank) tank).setLive(false);
                        Recorder.record();
                        enemyTanks.remove(tank);
                        enemyTankNum--;
                    } else if (tank instanceof MyTank) {
                        ((MyTank) tank).setLive(false);
                    }

                }
                break;
            case 1:
            case 3:
                if (shot.getX() > tank.getX() && shot.getX() < tank.getX() + 60
                        && shot.getY() > tank.getY()
                        && shot.getY() < tank.getY() + 40) {
                    System.out.println("被击中");
                    shot.setLive(false);
                    if (tank instanceof EnteryTank) {
                        ((EnteryTank) tank).setLive(false);
                        Recorder.record();
                        enemyTanks.remove(tank);
                        enemyTankNum--;
                    } else if (tank instanceof MyTank) {
                        ((MyTank) tank).setLive(false);
                    }

                }
                break;
        }
    }

    public void HitMyTank() {
        for (int i = 0; i < enemyTanks.size(); i++) {
            EnteryTank enteryTank = enemyTanks.get(i);
            for (int j = 0; j < enteryTank.getShots().size(); j++) {
                Shot shot = enteryTank.getShots().get(j);
                isHit(shot, mytank);
            }
        }

    }

    public void HitEnemyTank() {
        if (mytank.getShots().size() > 0) {
            for (int i = 0; i < enemyTanks.size(); i++) {
                EnteryTank enteryTank = enemyTanks.get(i);
                for (int j = 0; j < mytank.getShots().size(); j++) {
                    Shot shot = mytank.getShots().get(j);
                    isHit(shot, enteryTank);
                }
            }
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W) { // 向上
            mytank.setDirect(0);
            if (mytank.getY() > 0) { // 设置边界
                mytank.moveUp();
            }
        } else if (e.getKeyCode() == KeyEvent.VK_D) { // 向右
            mytank.setDirect(1);
            if (mytank.getX() + 60 < 1000) {
                mytank.moveRight();
            }
        } else if (e.getKeyCode() == KeyEvent.VK_S) { // 向下
            mytank.setDirect(2);
            if (mytank.getY() + 60 < 750) {
                mytank.moveDown();
            }
        } else if (e.getKeyCode() == KeyEvent.VK_A) { // 向左
            mytank.setDirect(3);
            if (mytank.getX() > 0) {
                mytank.moveLeft();
            }
        }

        if (e.getKeyCode() == KeyEvent.VK_J) { // 发射子弹
            mytank.shotEnemyTank(mytank.getX(), mytank.getY(), mytank.getDirect());
        }

        // // 重绘
        this.repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

    @Override
    public void run() {
        while (true) {
            this.repaint();
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            HitEnemyTank();

            HitMyTank();

            // if (enemyTankNum == 0) {
            // System.out.println("我方胜利");
            // break;
            // } else if (mytank.isLive() == false) {
            // System.out.println("敌方胜利");
            // break;
            // }
        }
    }

}
